2019

您所在的位置:网站首页 python mrp 2019

2019

2022-05-11 13:33| 来源: 网络整理| 查看: 265

       好用的Python,便捷的Pandas,在数据计算和分析中其强大的功能堪比数据库的存在,操作却如同Excel般易于上手。他比Excel、Word、PPT使用VBA更能提升办公自动化程度,也更让人有发展和想象的空间!人类科技的进步,在开源这个共享智慧的时代里,一日千里。

      这么好的东西,因为各种原因,如教材的高不可攀,或案例脱离应用场景,常常将人拒之门外,或者枯躁得让人无法坚持学习下去。

      作为数据分析的拥趸,有义务也有责任将这么好的技术和工具推荐给大家。接下来的日子里,将会和大家一起来学习Python这个语言,我们使用Spyder这个Python开发环境,[参考资料https://blog.csdn.net/yusongcan/article/details/77073794]

     首先我们需要安装Anaconda,建议安装3.7以上的版本,这个啊,想想看,有iphone6和iphone 11免费让你选,你会选哪个?[参考资料 https://blog.csdn.net/ITLearnHall/article/details/81708148]

      声明:对于长的参考资料,可以随便看,不想看的时候可以不看,想看的时候再看,这样才会走得更远!还有看教程一定要动手,可以一天选一个主题或一个任务来训练自己。欲成强者:动眼、动脑、还动手!网上看到好的资料,收藏到分类的收藏夹里。网上的文章、电子书和纸质的书都是学习的好帮手和好工具。

       眼见为实,现在我们就通过一个递归函数和MRP物料需求计划的计算来看一下我们“好用的Python,便捷的Pandas”,体验一下“人生苦短,我用Python”是何等深情的“告白”吧!

       用到的表单释义,抓住重点,我们尽量符合数据库第三范式。

进入正题,在Spyder新建一个空白文件,复制下列代码和注释

# -&- coding: utf-8 -&-

"""

Created on Mon Jul  8 22:05:32 2019

@author: same3

"""

#引入三个python 包

#pandas:数据分析包

import pandas as pd #"as"顾名思义,即以后可以在程序中以缩写pd 代表 pandas

#numpy:科学计算包

import numpy  as np

#xlwings:python操作Excel的模块,最好的Excel操作包之一,有取代VBA的趋势

#中文入门学习资料之一: https://www.cnblogs.com/catgatp/p/7875683.html

#英文官方学习网站https://docs.xlwings.org/en/stable/ 建设初学者有空翻翻,随便看看就好,不要太深入,因为太无趣

import xlwings as xw

#声明Excel应用程序,或直接使用 wb=xw.Book(file) 也可以

#app=xw.App(visible=True,add_book=False)  

"""

visible

Ture:可见excel

False:不可见excel

add_book

True:打开excel并且新建工作簿

False:不新建工作簿

"""

# display_alerts= False ,禁止Excel弹出提示的对话框

#app.display_alerts=False

#Excel 文件路径

file = r'D:\VBA\LEARNING_ERP.xlsm' #字符串前面加r,是表示其后的字符串不转义,使用真实字符

#打开Excel工作簿,文件路径:'D:\VBA\LEARNING_ERP.xlsm' ,可根据实际设定

wb=xw.Book(file)

wb.app.display_alerts=False

#引用工作簿(workbook)里的工作表(worksheet)

sht_test=wb.sheets['base'] #存放基础数据

sht_view=wb.sheets['view'] #存放计算后的数据

'''

引用单元格当前拓展区域,注意四周行和列的单元格(黄色部分)为空

工作表(worksheet)引用,下标从0从始,如sht_test[19,0];单元格(range)引用,下标从1开始,如sht_test.range(20,1)这是python的特例。

RNG1[第20行,第1列]的拓展区域(绿色部分),即20-45行,A-C列的区域,即Bom物料清单

RNG2(蓝色部分),即Plan产品生产计划

'''

RNG1= sht_test[19,0].api.currentregion

RNG2= sht_test[19,5].api.currentregion

#命名Excel单元格区域名称

RNG1.name='Bom'

RNG2.name='Plan'

'''

Plan及Bom资料导入pandas的DataFrame中

header=1表示单元格区第一行为列标题行

index=True表示单元格区第一列为索引列,False表示自动索引(从0开始)

'''

dfsz5= sht_test['Plan'].options(pd.DataFrame, header=1,index=True).value

dfsz6 = sht_test['Bom'].options(pd.DataFrame, header=1,index=True).value

'''

连接Plan和Bom,merge横向(列)连接,类似SQL SERVER数据库连接join,

left_index=True,right_index=True表示左右两个DataFrame以索引列为基准进行连接

how='inner'表示内连接

Bom(bill of material)根据物料清单(递归)计算 MRP 物料需求计划

第二阶开始到最尾阶的物料分解,从第一阶分解后取得所需数据

'''

def eeBom(df4A,df4,df2,CX1):

    df5=df4[['CID','PCQT','PROCID']]

    df5.rename(columns={'CID':'PID','PCQT':'PQT','PROCID':'PROPID'}, inplace = True)

    df5.reset_index(drop=True,inplace = True)

    df5.set_index('PID',inplace = True)

    df6=pd.merge(df5,df2,left_index=True,right_index=True,how='inner')

    if df6.empty :

        return df4A

    else:       

        df6['PCQT']=df6['PQT']*df6['CQT']

        df6['PROCID']=df6['PROPID']+'-'+str(CX1+1)

        df6['LEVEL']=CX1+1

        df4A=df4A.append(df6)

        return eeBom(df4A,df6,df2,CX1+1)   

#第一阶的物料分解,从Plan取得所需数据

#首先调动eBom函数,eBom函数再调用eeBom,但是eeBom要定义在eBom之前,不然会出错,会显示找不到eeBom函数                                                                       

def eBom(df1,df2):                 

    df3=pd.merge(df1,df2,left_index=True,right_index=True,how='inner')

    df3['PCQT']=df3['PQT']*df3['CQT']

    df3['PROCID']=df3['PROPID']+'-'+str(1)             

    df3['LEVEL']=1

    return eeBom(df3,df3,df2,1)

#计算MRP,并按单据号,物料父项编号排序   

dfsz7=eBom(dfsz5,dfsz6).sort_values(by=['PROCID','PID'])

#'FC'列标志物料子项是否为:'F'-尾阶(最终件),'M'-非尾阶(中间件)

#全部先标注为'M'

dfsz7['FC']='M'

#获取Bom表中所有物料父项编号,取唯一值即可

list1=list(dfsz6.index.unique())

#print(list1)

#对MRP物料需求计划表中的最终件标识为'F'

dfsz7.loc[~dfsz7['CID'].isin( list1),['FC']]='F'

#就这样完成啦!超简洁,有没有小伙伴们!

print(dfsz7) 

#导出到Excel,首先删除A:AA列,把格式也一起删除,用cells.delete或clear无法删除格式

sht_view.api.columns('A:AA').delete

sht_view.api.cells.delete

sht_view.clear

#在Excel view表'A1'单元格的扩展位置显示dfsz5(即:Plan生产计划表)

sht_view.range(1,1).expand().value =  dfsz5

#在Excel view表'E1'单元格的扩展位置显示dfsz6(即:Bom物料清单表)

sht_view.range(1,5).expand().value =  dfsz6

#在Excel view表'I1'单元格的扩展位置显示dfsz7(即:MRP物料需求计划表)

sht_view.range(1,9).expand().value = dfsz7

#在Excel view表'第4、8列设置列的颜色,便于在Excel中区分各个计算出来的数据集

sht_view.cells.columns(4).color=(255,128,255)

sht_view.cells.columns(8).color=(255,128,255)

#列自动调整宽度,如果要指定列宽可用 sht_view.range((1,1),(1,20)).api.ColumnWidth = 8

sht_view.api.columns('A:AA').autofit

结果如下:

      看不明白的小伙伴们不要着急,今天只是展示了Python强大功能的一角,接下来的日子里,我们就一起共同来学习和进步吧!

      工作之余要学习,学习之余要分享。平时只是看别人写,现在自己写一写,才知道其中需要巨大的努力,所谓的台上一分钟,台下十年功,诚不欺人也!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3